import setting from "./config.js";
import noLoadingUrls from './noLoadingUrls.js'

const install = (Vue, vm) => {
	// 初始化请求配置

	uni.$u.http.setConfig((config) => {
		// 域名设置
		config.baseURL = setting.IS_DEV ? setting.DEV_URL : setting.PRO_URL;
		config.header = {
			'Content-Type': 'application/json;charset=UTF-8',
			// 'Content-Type': 'application/x-www-form-urlencoded',
			// 'tenant-id': 1
		};
		// 设置为json，返回后会对数据进行一次JSON.parse()
		config.dataType = 'json';
		config.responseType = 'text';
		// 注：如果局部custom与全局custom有同名属性，则后面的属性会覆盖前面的属性，相当于Object.assign(全局，局部)
		config.custom = {
			ShowLoading: true, // Loading中是否遮罩
			LoadingMask: true, // Loading文本
			LoadingText: setting.LOADING_TEXT,
		}; // 全局自定义参数默认值
		// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
		config.timeout = setting.TIMEOUT;
		// #endif
		// #ifdef APP-PLUS
		// 验证 ssl 证书 仅5+App安卓端支持（HBuilderX 2.3.3+）
		config.sslVerify = true;
		// #endif
		// #ifdef H5
		// 跨域请求时是否携带凭证（cookies）仅H5支持（HBuilderX 2.6.15+）
		config.withCredentials = false;
		// #endif
		// #ifdef APP-PLUS
		// DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
		config.firstIpv4 = false;
		// #endif
		// 全局自定义验证器。参数为statusCode 且必存在，不用判断空情况。
		config.validateStatus = (statusCode) => { // statusCode 必存在。此处示例为全局默认配置
			return statusCode >= 200 && statusCode < 300
		};
		return config;
	});

	// 请求拦截部分，如配置，每次请求前都会执行
	uni.$u.http.interceptors.request.use((config) => {
		if (config.custom.ShowLoading && !isInIgnoreLoginUrls(config.url)) {
			uni.showLoading({
				title: config.custom.LoadingText || '正在加载',
				mask: config.custom.LoadingMask || false
			});
		}
		config.data = config.data || {}
		// config.data['timestamp'] = Math.round(new Date() / 1000); //时间戳;

		let _token = uni.getStorageSync('token') || ''
		if (_token != '' && _token != undefined) {
			config.header.Authorization = _token; 
		}
		if (setting.REQUEST_LOG) {
			_reqlog(config); // 是否开启请求日志
		}
		return config;

	}, config => {
		uni.hideLoading();
		if (setting.CATCH_MESS) {
			vm.$u.toast("请求时异常");
		}
		return Promise.reject(config)
	})

	// 响应拦截，如配置，每次请求结束都会执行本方法
	uni.$u.http.interceptors.response.use((res) => {
		if (res.config.custom.ShowLoading) {
			uni.hideLoading();
		}
		if (setting.REQUEST_LOG) {
			_reslog(res)
		}
		if (res.statusCode != 200) {
			vm.$u.toast(res.statusCode);
			return;
		}
		let result = res.data;
		// 只有在 code = 0 时返回数据
		if (result.code === 0) {
			return Promise.resolve(result.data);
		} 
		// 处理401未授权的情况
		if (result.code === 401) {
			if (!isInIgnoreLoginUrls(res.config.url)) {
				showLoginModal();
			}
			return;
		}
		// 其他错误情况显示错误信息
		vm.$u.toast(result.msg);
		return Promise.reject(result.data)
	}, (response) => {
		uni.hideLoading();

		if (setting.CATCH_MESS) {
			vm.$u.toast("响应时异常！");
		}
		vm.$u.toast(response.data.msg);
		return Promise.reject(response)
	});
}
//请求日志
function _reqlog(req) {
	console.log("请求地址：" + req.baseURL + req.url)
	console.log("请求参数：" + JSON.stringify(req.data))
}
//响应日志
function _reslog(res) {
	console.log("响应结果：" + JSON.stringify(res))
}

// 检测 url 是否在 ignoreLoginUrls 中
function isInIgnoreLoginUrls(url) {
	return setting.ignoreLoginUrls.includes(url)
}
// 提示登录
function showLoginModal() {
	uni.showModal({
		title: '请登录',
		content: '登陆后体验完整功能',
		success: res => {
			if (res.confirm) {
				uni.navigateTo({ url: '/pages/public/login' })
			}
		}
	})
}
export default {
	install
}